package com.wei.czz.framework.admin.service;

import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.vo.admin.dept.DeptFormVo;
import com.wei.czz.framework.admin.entity.DeptEntity;
import org.springframework.lang.NonNull;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-08-16 21:18:56
 * className: DeptService 系统部门操作服务接口
 * version: 1.0
 * description:
 */
public interface DeptService {

    /**
     * 保存部门操作
     * @param dept 部门对象
     */
    void saveOrEdit(DeptEntity dept);

    /**
     * 批量保存部门操作
     * @param deptList 部门对象列表
     */
    void batchSave(List<DeptEntity> deptList);

    /**
     * 分页查询部门操作
     * 包含子部门数据
     * @param requestMode 请求模式【true-树形分页 false-全量分页】
     * @param idList      部门主键列表
     * @param deptFormVo  参数对象
     * @return 部门对象列表
     */
    PageDto<DeptEntity> getPageList(boolean requestMode, List<Long> idList, DeptFormVo deptFormVo);

    /**
     * 获取所有部门操作
     * @return 部门列表
     */
    List<DeptEntity> getDeptList();

    /**
     * 获取部门操作
     * @param id 部门主键
     * @return 部门对象
     */
    DeptEntity get(Long id);

    /**
     * 查询子部门主键操作
     * 根据父级部门主键查询其子、子孙部门主键
     * @param id 父级部门主键
     * @return 子部门主键列表
     */
    List<Long> getChildrenIdList(Long id);

    /**
     * 查询直接子部门主键数据操作
     * 根据部门主键，查询其直接子部门主键数据
     * @param id 部门主键
     * @return 子部门主键数据
     */
    List<Long> getDirectChildrenIdList(Long id);

    /**
     * 查询子部门数据操作
     * 根据父级部门路径查询其所有子部门数据
     * @param parentPath 父级部门路径
     * @return 子部门数据
     */
    List<DeptEntity> getChildrenList(String parentPath);

    /**
     * 获取父级部门主键操作
     * @param id 部门主键
     * @return 父级部门主键列表
     */
    List<Long> findParentIdList(Long id);

    /**
     * 获取父级部门主键操作
     * @param dept 部门对象
     * @return 父级部门主键列表
     */
    List<Long> findParentIdList(DeptEntity dept);

    /**
     * 获取父级部门主键操作
     * @param idList 主键列表
     * @return 父级部门主键列表
     */
    List<Long> findParentIdList(List<Long> idList);

    /**
     * 获取部门操作
     * @param idList 主键列表
     * @return 部门对象列表
     */
    List<DeptEntity> getList(List<Long> idList);

    /**
     * 获取部门及其子、子孙部门操作
     * @param idList 主键列表
     * @return 部门对象列表
     */
    List<DeptEntity> findList(List<Long> idList);

    /**
     * 查询直接子部门操作
     * @param parentId 父级部门主键
     * @return 部门对象列表
     */
    List<DeptEntity> findDirectChildrenList(Long parentId);

    /**
     * 获取部门操作
     * @param nameList 名称列表
     * @return 部门对象列表
     */
    List<DeptEntity> findListByName(List<String> nameList);

    /**
     * 获取下一个默认排序等级操作
     * 根据部门主键，获取该部门下子部门的下一个默认排序等级
     * @param deptId 部门主键
     * @return 排序等级数值
     */
    Integer getNextSort(Long deptId);

    /**
     * 获取部门名称映射操作
     * @param deptIdCollection 部门主键集合
     * @param function         key映射方法
     * @return 部门名称映射
     * @param <R> 泛型类型
     */
    <R> Map<R, String> getDeptNameMap(Collection<Long> deptIdCollection, @NonNull Function<Long, R> function);

    /**
     * 批量更新部门操作
     * @param deptList 部门对象列表
     */
    void batchUpdate(List<DeptEntity> deptList);

    /**
     * 批量删除部门操作
     * @param deptIdCollection 部门主键集合
     */
    void delete(List<Long> deptIdCollection);

}

